package com.example.demo.algorithm.graph;


import com.example.demo.algorithm.linear.Queue;

/**
 * @Author: xiatian
 * @CreateTime: 2022/2/5 11:55 上午
 * @Description:无向图的实现
 */
public class Graph {
    //顶点的数目
    private int V;
    //边的数目
    private int E;
    //邻接表
    private Queue<Integer>[] adj;

    public Graph(int V) {
        this.V = V;
        this.E = 0;
        //初始化领接表
        this.adj = new Queue[V];
        for (int i = 0; i < adj.length; i++) {
            adj[i] = new Queue<Integer>();
        }
    }

    //获取顶点的数目
    public int V() {
        return V;
    }

    //获取边的数目
    public int E() {
        return E;
    }

    /**
     * 向图中添加一条边为v-w
     *
     * @param v
     * @param w
     */
    public void addEdge(int v, int w) {
//在无向图中，边是没有方向的，所以该边可以说是从v-w也可以是从w到v的边，因此让w出现在v的领接表中，并且还要让v出现在w的领接表中
        adj[v].enqueue(w);
        adj[w].enqueue(v);
        //边加一
        E++;
    }

    /**
     * 获取顶点v相邻的所有顶点
     *
     * @param v
     * @return
     */
    public Queue<Integer> adj(int v) {
        return adj[v];
    }
}
